package cn.itcast.web.controller.cargo;

import cn.itcast.domain.cargo.ContractProduct;
import cn.itcast.domain.cargo.ContractProductExample;
import cn.itcast.domain.cargo.Factory;
import cn.itcast.domain.cargo.FactoryExample;
import cn.itcast.service.cargo.ContractProductService;
import cn.itcast.service.cargo.FactoryService;
import cn.itcast.utils.ImageUploadUtils;
import cn.itcast.web.controller.BaseController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.util.StringUtils;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

@Controller
@RequestMapping("/cargo/contractProduct")
public class ContractProductController extends BaseController {
    @Reference
    private FactoryService factoryService;

    @Reference
    private ContractProductService contractProductService;


    /*
        货物上传 路径/cargo/contractProduct/list.do?contractId=${o.id}
        1、查询货物的生产厂家信息
        2、根据合同ID查询所有的货物信息
        3、将查询到的货物信息保存到request域中
        4、跳转页面展示信息
     */
    @RequestMapping("/list")
    public String findAll(
            @RequestParam(defaultValue = "1")int page,
            @RequestParam(defaultValue = "5")int size,
            String contractId){
        //创建查询生产厂家条件
        FactoryExample example = new FactoryExample();
        FactoryExample.Criteria criteria = example.createCriteria();
        criteria.andCtypeEqualTo("货物");
        //1、查询货物的生产厂家信息
        List<Factory> list = factoryService.findAll(example);
        request.setAttribute("factoryList",list);
        //2、根据合同ID查询所有的货物信息
        ContractProductExample cpe = new ContractProductExample();
        ContractProductExample.Criteria cpeCriteria = cpe.createCriteria();
        cpeCriteria.andContractIdEqualTo(contractId);
        //分页查询
        PageInfo info = contractProductService.findAll(cpe, page, size);
        //3、将查询到的货物信息保存到request域中
        request.setAttribute("page",info);
        //为了方便添加附件内容，将合同ID存储到request域中
        request.setAttribute("contractId",contractId);
        //4、跳转页面展示信息
        return "cargo/product/product-list";
    }

    /*
        保存货物信息  地址：/cargo/contractProduct/edit.do
        货物：包含了contractId（外键）
        修改edit方法
            完成图片上传
                1、java代码：springmvc.xml配置文件中配置文件解析器
                2、方法中通过multipartFile描述文件对象，（参数名=页面input的name属性）
     */
    @RequestMapping("/edit")
    public String edit(ContractProduct cp, MultipartFile productPhoto) throws IOException {
        //保存当前登录企业ID
        cp.setCompanyId(getLoginCompanyId());
        cp.setCompanyName(getLoginCompanyName());
        //判断ID是否为空
        if (StringUtils.isEmpty(cp.getId())){
            //ID为空执行保存的方法
            //判断是否有上传图片信息
            if (!productPhoto.isEmpty()){
                //含有上传的图片信息执行图片上传保存
                String url = new ImageUploadUtils().upload(productPhoto.getBytes());
                //将地址保存到contractProduct对象中
                cp.setProductImage(url);
            }
            //保存数据
            contractProductService.save(cp);
        }else {
            //修改contractProduct数据
            contractProductService.update(cp);
        }

        //返回展示页面
        return "redirect:/cargo/contractProduct/list.do?contractId="+cp.getContractId();
    }

    /*
        修改指定的货物信息
            地址：/cargo/contractProduct/toUpdate.do
            参数：id
            返回值：跳转到修改页面
     */
    @RequestMapping("/toUpdate")
    public String toUpdate(String id){
        FactoryExample example = new FactoryExample();
        FactoryExample.Criteria criteria = example.createCriteria();
        criteria.andCtypeEqualTo("货物");
        //调用FactoryService查询生成厂家信息
        List<Factory> list = factoryService.findAll(example);
        //保存到request域中
        request.setAttribute("factoryList",list);
        //调用contractProductService根据ID查询货物信息
        ContractProduct contractProduct = contractProductService.findById(id);
        //将货物信息保存到request域中带到页面展示
        request.setAttribute("contractProduct",contractProduct);
        //跳转到页面展示
        return "/cargo/product/product-update";
    }

    /*
        删除货物信息
            地址：/cargo/contractProduct/delete.do
            参数：货物ID 合同ID
            返回值：跳转到查询货物信息页面
     */
    @RequestMapping("/delete")
    public String delete(String id,String contractId){
        //调用contractproductService删除
        contractProductService.delete(id);
        return "redirect:/cargo/contractProduct/list.do?contractId="+contractId;
    }

    /*
        使用Excel批量上传货物信息
        地址：/cargo/contractProduct/toImport.do
     */
    @RequestMapping("/toImport")
    public String toImport(String contractId){
        //将合同id保存到request域中
        request.setAttribute("contractId",contractId);
        //跳转到批量上传页面
        return "cargo/product/product-import";
    }

    /*
        批量上传保存数据
        地址：/cargo/contractProduct/import.do
     */
    @RequestMapping("/import")
    public String importExcel(String contractId,MultipartFile file) throws IOException {
        List<ContractProduct> list = EasyExcel.read(file.getInputStream())
                .head(ContractProduct.class)//设置表头，将数据转化为目标对象
                .sheet(0)//设置读取第一页数据（使用的是索引方式，所以从0开始）
                .doReadSync();//解析Excel，获取所有的数据

        //遍历集合，获取读取到的所有数据
        for (ContractProduct contractProduct : list) {
            System.out.println(contractProduct);
            //将所有的货物数据添加上当前登录企业ID和企业名称
            contractProduct.setCompanyId(getLoginCompanyId());
            contractProduct.setCompanyName(getLoginCompanyName());
            //设置合同ID
            contractProduct.setContractId(contractId);
        }
        //调用方法保存数据
        contractProductService.saveAll(contractId,list);
        //跳转到查询所有货物数据页面
        return "redirect:/cargo/contractProduct/list.do?contractId="+contractId;
    }
}
